package server

import (
	"mytinydb/dbCore"
	"strconv"
)

func set(db *dbCore.Db, args []string) (res string, err error) {
	key, value := args[0], args[1]
	if err := db.Set([]byte(key), []byte(value)); err == nil {
		res = "OK"
	} else {
		res = "set错误"
	}
	return
}

func get(db *dbCore.Db, args []string) (res string, err error) {
	key := args[0]
	if val, err := db.Get([]byte(key)); err == nil {
		res = string(val)
	} else {
		res = "get错误"
	}
	return
}

// 若key存在，则不做任何操作，否则设置key和value
func setNx(db *dbCore.Db, args []string) (res string, err error) {
	key, value := args[0], args[1]
	if err := db.SetNx([]byte(key), []byte(value)); err == nil {
		res = "OK"
	} else {
		res = "SetNx错误，可能存在，请使用exist进行查询"
	}
	return
}

func Exists(db *dbCore.Db, args []string) (res string, err error) {
	if exist := db.Existed([]byte(args[0])); exist {
		res = "存在"
	} else {
		res = "不存在"
	}
	return
}

//  Getset 命令用于设置指定 key 的值，并返回 key 的旧值。
func getset(db *dbCore.Db, args []string) (res string, err error) {
	key, value := args[0], args[1]
	if before, err := db.GetSet([]byte(key), []byte(value)); err == nil {
		res = string(before)
	} else {
		res = "GETSET错误"
	}
	return
}

//如果 key 已经存在并且是一个字符串， APPEND 命令将 value 追加到 key 原来的值的末尾。
//如果 key 不存在， APPEND 就简单地将给定 key 设为 value ，就像执行 SET key value 一样。
func append(db *dbCore.Db, args []string) (res string, err error) {
	key, value := args[0], args[1]
	if err := db.Append([]byte(key), []byte(value)); err == nil {
		res = "OK"
	} else {
		res = "append错误"
	}
	return
}

//命令用于获取指定 key 所储存的字符串值的长度。当 key 储存的不是字符串值时，返回一个错误
func strlen(db *dbCore.Db, args []string) (res string, err error) {
	if length, err := db.Strlen([]byte(args[0])); err == nil {
		res = strconv.Itoa(length)
	} else {
		res = "strlen错误"
	}
	return
}

func init() {
	AddExecCmd("set", set)
	AddExecCmd("get", get)
	AddExecCmd("setnx", setNx)
	AddExecCmd("exists", Exists)
	AddExecCmd("getset", getset)
	AddExecCmd("append", append)
	AddExecCmd("strlen", strlen)
}
